# 该命令表示项目的名称是 main
PROJECT(main) 

# 限定了 CMake 的版本
CMAKE_MINIMUM_REQUIRED(VERSION 2.6) 


SET(CMAKE_SOURCE_DIR .)

# 在 Visual Studio 中我们可以生成 debug 版和 release 版的程序,使用 CMake我们也可以达到上述效果。debug版的项目生成的可执行文件需要有调试信息并且不
# 需要进行优化,而 release 版的不需要调试信息但需要优化。这些特性在gcc/g++中是通过编译时的参数来决定的,如果将优化程度调到最高需要设置参数-O3,最低是-O0
# 即不做优化;添加调试信息的参数是-g-ggdb ,如果不添加这个参数,调试信息就不会被包含在生成的二进制文件中。CMake 中有一个变量 CMAKE_BUILD_TYPE ,可以
# 的取值是 Debug Release RelWithDebInfo和MinSizeRel。当这个变量值为Debug的时候,CMake会使用变量CMAKE_CXX_FLAGS_DEBUG和CMAKE_C_FLAGS_DEBUG
# 中的字符串作为编译选项生成 Makefile ,当这个变量值为 Release 的时候,工程会使用变量 CMAKE_CXX_FLAGS_RELEASE 和 CMAKE_C_FLAGS_RELEASE 选项生成 # Makefile。两个变量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_CXX_FLAGS_RELEASE, 这两个变量是分别用于 debug 和 release 的编译选项
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")


# 文件 Findlibxxxxx.cmake 的命名要符合规范: FindlibNAME.cmake ,其中NAME 是函数库的名称。Findlibxxxxx.cmake 的语法与 CMakeLists.txt 相同
# 到目录 ./cmake/modules 中查找 Findlibxxxxx.cmake
SET(CMAKE_MODULE_PATH ${CMAKE_ROOT}/Modules  ${CMAKE_SOURCE_DIR}/cmake/modules) 


# 命令 ADD_SUBDIRECTORY 指明本项目包含一个子目录 subsrc 
# 当程序执行命令 ADD_SUBDIRECTORY( subsrc ) 时进入目录 subsrc 对其中的 CMakeLists.txt 进行解析
ADD_SUBDIRECTORY( src/subsrc )


# 将当前目录中的源文件名称赋值给变量 DIR_SRCS
# CMake 手册中对命令 AUX_SOURCE_DIRECTORY 的描述如下:
#	 aux_source_directory(<dir> <variable>)
# 该命令会把参数 <dir> 中所有的源文件名称赋值给参数 <variable>
AUX_SOURCE_DIRECTORY(./src DIR_SRCS) 

# ADD_EXECUTABLE 指示变量 DIR_SRCS 中的源文件需要编译 成一个名称为 main 的可执行文件
ADD_EXECUTABLE(main ${DIR_SRCS})

# 使用命令 FIND_PACKAGE 进行查找,这条命令执行后 CMake 会到变量 CMAKE_MODULE_PATH 指示的目录中查找文件 Findlibxxxxx.cmake 并执行
# REQUIRED 表示如果没有找到，cmake会停止处理，并报告一个错误
FIND_PACKAGE( libsotest REQUIRED)

MARK_AS_ADVANCED(
	LIBSOTEST_CXX_INCLUDE_DIR
	LIBSOTEST_CXX_LIBRARIES
)

FIND_LIBRARY(CLASSTEST_LIBRARIES class-test  ${CMAKE_SOURCE_DIR}/src/lib)

MESSAGE(libsotest_include: ${LIBSOTEST_CXX_INCLUDE_DIR})
MESSAGE(libsotest_library: ${LIBSOTEST_CXX_LIBRARIES})
MESSAGE(class-export-test: ${CLASSTEST_LIBRARIES})

# 条件判断语句,表示如果 LIBSOTEST_CXX_INCLUDE_DIR 和 LIBSOTEST_CXX_LIBRARIES 都已经被赋值
IF (LIBSOTEST_CXX_INCLUDE_DIR AND LIBSOTEST_CXX_LIBRARIES)
	MESSAGE(STATUS "Found libsotest libraries")

	#则设置编译时到 LIBSOTEST_CXX_INCLUDE_DIR 寻找头文件
	INCLUDE_DIRECTORIES(${LIBSOTEST_CXX_INCLUDE_DIR})

	MESSAGE( ${LIBSOTEST_CXX_LIBRARIES} )

	# 并且设置可执行文件 main 需要与链接库 LIBSOTEST_CXX_LIBRARIES 进行连接
	TARGET_LINK_LIBRARIES(main ${LIBSOTEST_CXX_LIBRARIES} ${CLASSTEST_LIBRARIES})
ENDIF (LIBSOTEST_CXX_INCLUDE_DIR AND LIBSOTEST_CXX_LIBRARIES)


MESSAGE( "CLASSTEST:" ${CLASSTEST_LIBRARIES})

#INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/include)
#TARGET_LINK_LIBRARIES(main ${CLASSTEST_LIBRARIES})

# 命令 TARGET_LINK_LIBRARIES 指明可执行文件 main 需要连接一个名为 so 的链接库 
# TARGET_LINK_LIBRARIES( main so )